home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldpcx04
/
ldpcx04s.lzh
/
LDPCX8.S
< prev
next >
Wrap
Text File
|
1997-06-10
|
25KB
|
1,256 lines
*****************************************************************
* 256色のPCX *
*****************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xdef _pcx8_prt
.xdef _pcx8_scroll
.xref _Wait
.xref _PageSync
.xref key_chk
.xref tenkey_chk
.xref cursor_chk
.xref mouse_chk
.xref x_set
.xref y_set
.xref inf_change
.xref tate
.xref yoko
.xref x_max
.xref y_max
.xref x_pos
.xref y_pos
.xref gr_addr
.xref fi_size
.xref buff_addr
.xref kflg
.xref esc_flg
.xref next_flg
.xref inkey_flg3
.xref scroll_key
.xref s_dot8
.text
.even
*****************************************************************
* 256色表示 *
*****************************************************************
_pcx8_prt:
bsr line_byte_set *1ラインのバイト数を求める
bsr front_line_set *表側に表示する横ドット数を求める
bsr back_line_set *裏側に表示する横ドット数を求める
bsr y_line_set *表示する縦ドット数を求める
bsr pcx8_prt *表示
rts
*****************************************************************
* 256色スクロール *
*****************************************************************
_pcx8_scroll:
bsr scroll
rts
*****************************************************************
* 1ラインのバイト数を求める *
*****************************************************************
line_byte_set:
move.w yoko(pc),d0
addq.w #3,d0
andi.w #$fffc,d0
move.w d0,line_byte
rts
*****************************************************************
* 表側に表示する横ドット数を求める *
*****************************************************************
front_line_set:
move.w x_pos(pc),d0
add.w yoko(pc),d0
cmp.w #512,d0
bhi front_line1
move.w yoko(pc),x_line
bra front_line2
front_line1:
move.w #512,d0
sub.w x_pos(pc),d0
move.w d0,x_line
front_line2:
rts
*****************************************************************
* 裏側に表示する横ドット数を求める *
*****************************************************************
back_line_set:
clr.w x_line_bk
clr.w x_sabun_bk
clr.w x_pos_bk
move.w x_pos(pc),d0 *裏画面を表示するか
add.w yoko(pc),d0 *page0の左半分(左256dot)に収まるとき
cmp.w #256,d0 *裏画面は表示しない
bls back_line4
move.w x_pos(pc),d0 *表画面は右半分(右256dot)から表示しているか
sub.w #256,d0
bmi back_line2 *違う
back_line1: *表画面の右側から表示
move.w d0,x_pos_bk
move.w yoko(pc),d0
cmp.w x_line(pc),d0
bhi back_line1_
move.w x_line(pc),x_line_bk
bra back_line1__
back_line1_:
move.w yoko(pc),x_line_bk
back_line1__:
* clr.w x_sabun_bk
bra back_line4
back_line2: *表画面の左側から右側に表示
move.w yoko(pc),d0
cmp.w #768,d0
bls back_line3
move.w #768,d0
back_line3:
move.w #256,d1
sub.w x_pos(pc),d1
move.w d1,x_sabun_bk
sub.w d1,d0
move.w d0,x_line_bk
* clr.w x_pos_bk
back_line4:
rts
*****************************************************************
* 縦方向の表示する長さを求める *
*****************************************************************
y_line_set:
move.w tate(pc),d0
cmp.w #512,d0
bcs y_line1
move.w #512,d0
y_line1:
move.w d0,pcx_yd *pcx_ydot数
move.w d0,y_line
rts
*****************************************************************
* 表示 *
*****************************************************************
pcx8_prt:
tst.w x_line_bk *裏画面を表示するか
beq pcx8_prt1 *しない
move.w x_pos_bk(pc),gram_x *表示座標
move.w y_pos(pc),gram_y
move.w x_sabun_bk(pc),pcx_x *表示範囲(x,y)
clr.w pcx_y
move.w x_line_bk(pc),pcx_xd
move.w y_line(pc),pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
adda.l #$c80000,a2
bsr pcx8_put
pcx8_prt1:
move.w x_pos(pc),gram_x *表示座標
move.w y_pos(pc),gram_y
clr.w pcx_x *表示範囲(x,y)
clr.w pcx_y
move.w x_line(pc),pcx_xd
move.w y_line(pc),pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
adda.l #GRAM,a2
bsr pcx8_put
rts
pcx8_put:
move.w pcx_xd(pc),d0 *横ドット数
moveq.l #0,d3 *次のラインへのバイト数
move.w line_byte(pc),d3 *(転送元)
sub.w d0,d3
move.l #512,d5 *表示データの1ライン下までの差分
sub.w d0,d5 *(表示先)
add.w d5,d5
addq.l #1,a2 *転送先を奇数アドレスにする
move.w pcx_yd(pc),d7 *縦ループ数
subq.w #1,d7 *dbraのため-1
cmpi.b #MC68060,MPUTYPE *MC68060か
bcc pcx8_put60
cmpi.w #4,d0 *転送横サイズが4未満か
bcs pcx8_put60 *そう
move.l a1,d6 *転送もとが奇数アドレスか
btst.l #0,d6
bne pcx8_putk
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
cmpi.b #MC68030,MPUTYPE *MC68030か
bcc pcx8_put30
pcx8_put00: *MC68000用
move.w #1024,d5 *データの補正
adda.w d0,a2
adda.w d0,a2
lea.l pcx8_put02(pc),a3 *ジャンプアドレス計算
move.w d0,d1
lsr.w #1,d1
add.w d0,d1
suba.w d1,a3
pcx8_put01:
jmp (a3)
move.l (a1)+,d6
movep.l d6,-1024(a2)
move.l (a1)+,d6
movep.l d6,-1016(a2)
move.l (a1)+,d6
movep.l d6,-1008(a2)
move.l (a1)+,d6
movep.l d6,-1000(a2)
move.l (a1)+,d6
movep.l d6,-992(a2)
move.l (a1)+,d6
movep.l d6,-984(a2)
move.l (a1)+,d6
movep.l d6,-976(a2)
move.l (a1)+,d6
movep.l d6,-968(a2)
move.l (a1)+,d6
movep.l d6,-960(a2)
move.l (a1)+,d6
movep.l d6,-952(a2)
move.l (a1)+,d6
movep.l d6,-944(a2)
move.l (a1)+,d6
movep.l d6,-936(a2)
move.l (a1)+,d6
movep.l d6,-928(a2)
move.l (a1)+,d6
movep.l d6,-920(a2)
move.l (a1)+,d6
movep.l d6,-912(a2)
move.l (a1)+,d6
movep.l d6,-904(a2)
move.l (a1)+,d6
movep.l d6,-896(a2)
move.l (a1)+,d6
movep.l d6,-888(a2)
move.l (a1)+,d6
movep.l d6,-880(a2)
move.l (a1)+,d6
movep.l d6,-872(a2)
move.l (a1)+,d6
movep.l d6,-864(a2)
move.l (a1)+,d6
movep.l d6,-856(a2)
move.l (a1)+,d6
movep.l d6,-848(a2)
move.l (a1)+,d6
movep.l d6,-840(a2)
move.l (a1)+,d6
movep.l d6,-832(a2)
move.l (a1)+,d6
movep.l d6,-824(a2)
move.l (a1)+,d6
movep.l d6,-816(a2)
move.l (a1)+,d6
movep.l d6,-808(a2)
move.l (a1)+,d6
movep.l d6,-800(a2)
move.l (a1)+,d6
movep.l d6,-792(a2)
move.l (a1)+,d6
movep.l d6,-784(a2)
move.l (a1)+,d6
movep.l d6,-776(a2)
move.l (a1)+,d6
movep.l d6,-768(a2)
move.l (a1)+,d6
movep.l d6,-760(a2)
move.l (a1)+,d6
movep.l d6,-752(a2)
move.l (a1)+,d6
movep.l d6,-744(a2)
move.l (a1)+,d6
movep.l d6,-736(a2)
move.l (a1)+,d6
movep.l d6,-728(a2)
move.l (a1)+,d6
movep.l d6,-720(a2)
move.l (a1)+,d6
movep.l d6,-712(a2)
move.l (a1)+,d6
movep.l d6,-704(a2)
move.l (a1)+,d6
movep.l d6,-696(a2)
move.l (a1)+,d6
movep.l d6,-688(a2)
move.l (a1)+,d6
movep.l d6,-680(a2)
move.l (a1)+,d6
movep.l d6,-672(a2)
move.l (a1)+,d6
movep.l d6,-664(a2)
move.l (a1)+,d6
movep.l d6,-656(a2)
move.l (a1)+,d6
movep.l d6,-648(a2)
move.l (a1)+,d6
movep.l d6,-640(a2)
move.l (a1)+,d6
movep.l d6,-632(a2)
move.l (a1)+,d6
movep.l d6,-624(a2)
move.l (a1)+,d6
movep.l d6,-616(a2)
move.l (a1)+,d6
movep.l d6,-608(a2)
move.l (a1)+,d6
movep.l d6,-600(a2)
move.l (a1)+,d6
movep.l d6,-592(a2)
move.l (a1)+,d6
movep.l d6,-584(a2)
move.l (a1)+,d6
movep.l d6,-576(a2)
move.l (a1)+,d6
movep.l d6,-568(a2)
move.l (a1)+,d6
movep.l d6,-560(a2)
move.l (a1)+,d6
movep.l d6,-552(a2)
move.l (a1)+,d6
movep.l d6,-544(a2)
move.l (a1)+,d6
movep.l d6,-536(a2)
move.l (a1)+,d6
movep.l d6,-528(a2)
move.l (a1)+,d6
movep.l d6,-520(a2)
move.l (a1)+,d6
movep.l d6,-512(a2)
move.l (a1)+,d6
movep.l d6,-504(a2)
move.l (a1)+,d6
movep.l d6,-496(a2)
move.l (a1)+,d6
movep.l d6,-488(a2)
move.l (a1)+,d6
movep.l d6,-480(a2)
move.l (a1)+,d6
movep.l d6,-472(a2)
move.l (a1)+,d6
movep.l d6,-464(a2)
move.l (a1)+,d6
movep.l d6,-456(a2)
move.l (a1)+,d6
movep.l d6,-448(a2)
move.l (a1)+,d6
movep.l d6,-440(a2)
move.l (a1)+,d6
movep.l d6,-432(a2)
move.l (a1)+,d6
movep.l d6,-424(a2)
move.l (a1)+,d6
movep.l d6,-416(a2)
move.l (a1)+,d6
movep.l d6,-408(a2)
move.l (a1)+,d6
movep.l d6,-400(a2)
move.l (a1)+,d6
movep.l d6,-392(a2)
move.l (a1)+,d6
movep.l d6,-384(a2)
move.l (a1)+,d6
movep.l d6,-376(a2)
move.l (a1)+,d6
movep.l d6,-368(a2)
move.l (a1)+,d6
movep.l d6,-360(a2)
move.l (a1)+,d6
movep.l d6,-352(a2)
move.l (a1)+,d6
movep.l d6,-344(a2)
move.l (a1)+,d6
movep.l d6,-336(a2)
move.l (a1)+,d6
movep.l d6,-328(a2)
move.l (a1)+,d6
movep.l d6,-320(a2)
move.l (a1)+,d6
movep.l d6,-312(a2)
move.l (a1)+,d6
movep.l d6,-304(a2)
move.l (a1)+,d6
movep.l d6,-296(a2)
move.l (a1)+,d6
movep.l d6,-288(a2)
move.l (a1)+,d6
movep.l d6,-280(a2)
move.l (a1)+,d6
movep.l d6,-272(a2)
move.l (a1)+,d6
movep.l d6,-264(a2)
move.l (a1)+,d6
movep.l d6,-256(a2)
move.l (a1)+,d6
movep.l d6,-248(a2)
move.l (a1)+,d6
movep.l d6,-240(a2)
move.l (a1)+,d6
movep.l d6,-232(a2)
move.l (a1)+,d6
movep.l d6,-224(a2)
move.l (a1)+,d6
movep.l d6,-216(a2)
move.l (a1)+,d6
movep.l d6,-208(a2)
move.l (a1)+,d6
movep.l d6,-200(a2)
move.l (a1)+,d6
movep.l d6,-192(a2)
move.l (a1)+,d6
movep.l d6,-184(a2)
move.l (a1)+,d6
movep.l d6,-176(a2)
move.l (a1)+,d6
movep.l d6,-168(a2)
move.l (a1)+,d6
movep.l d6,-160(a2)
move.l (a1)+,d6
movep.l d6,-152(a2)
move.l (a1)+,d6
movep.l d6,-144(a2)
move.l (a1)+,d6
movep.l d6,-136(a2)
move.l (a1)+,d6
movep.l d6,-128(a2)
move.l (a1)+,d6
movep.l d6,-120(a2)
move.l (a1)+,d6
movep.l d6,-112(a2)
move.l (a1)+,d6
movep.l d6,-104(a2)
move.l (a1)+,d6
movep.l d6,-96(a2)
move.l (a1)+,d6
movep.l d6,-88(a2)
move.l (a1)+,d6
movep.l d6,-80(a2)
move.l (a1)+,d6
movep.l d6,-72(a2)
move.l (a1)+,d6
movep.l d6,-64(a2)
move.l (a1)+,d6
movep.l d6,-56(a2)
move.l (a1)+,d6
movep.l d6,-48(a2)
move.l (a1)+,d6
movep.l d6,-40(a2)
move.l (a1)+,d6
movep.l d6,-32(a2)
move.l (a1)+,d6
movep.l d6,-24(a2)
move.l (a1)+,d6
movep.l d6,-16(a2)
move.l (a1)+,d6
movep.l d6,-8(a2)
pcx8_put02:
move.w d4,d1
beq pcx8_put04
subq.w #1,d1
moveq.l #0,d0
pcx8_put03:
move.b (a1)+,(a2,d0.w)
addq.l #2,d0
dbra.w d1,pcx8_put03
pcx8_put04:
adda.l d3,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
dbra.w d7,pcx8_put01
rts
pcx8_put30: *MC68030以上用(タブソ)
lsr.w #2,d0 *1/4
subq.w #1,d0
pcx8_put31:
move.w d0,d1
pcx8_put32:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,pcx8_put32
move.w d4,d1
beq pcx8_put34
subq.w #1,d1
pcx8_put33:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,pcx8_put33
pcx8_put34:
adda.l d3,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
dbra.w d7,pcx8_put31
rts
pcx8_put60: *MC68060以上用(タブソ)
subq.w #1,d0 *転送横サイズが4未満の時
pcx8_put61:
move.w d0,d1
pcx8_put62:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,pcx8_put62
adda.l d3,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
dbra.w d7,pcx8_put61
rts
pcx8_putk: *転送もとアドレスが奇数の時
cmpi.w #5,d0 *転送横サイズが5未満か
bcs pcx8_put60 *そう
subq.w #1,d0
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
lsr.w #2,d0
subq.w #1,d0
pcx8_putk1:
move.b (a1)+,(a2)
addq.l #2,a2
move.w d0,d1
pcx8_putk2:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,pcx8_putk2
move.w d4,d1
beq pcx8_putk4
subq.w #1,d1
pcx8_putk3:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,pcx8_putk3
pcx8_putk4:
adda.l d3,a1 *変換元アドレス更新
adda.l d5,a2 *表示先アドレス更新
dbra.w d7,pcx8_putk1
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
clr.w x_old
clr.w y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
* bsr mouse_chk *マウスからの入力チェック
tst.b esc_flg *エスケープ入力有るか
bne scroll9 *指定有り
tst.b next_flg *ネクスト入力有るか
bne scroll9 *指定有り
bsr wait_chk *ウェイト値の変更チェック
bsr cursor_chk *カーソルキーからの入力チェック
bsr tenkey_chk *テンキー入力チェック
bsr mouse_chk *マウスからの入力チェック
bsr _PageSync *768x512 256色モード
bsr go_scroll
bra scroll2 *キー入力に戻る
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk *マウスからの入力チェック
scroll9:
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
move.w s_dot8(pc),-(sp)
lsr.w s_dot8
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr _PageSync *768x512 256色モード
bsr down
cmp.w y_max(pc),d3
bne down_demo0
down_demo8:
move.w (sp)+,s_dot8
down_demo9:
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot8(pc),-(sp)
lsr.w s_dot8
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr _PageSync *768x512 256色モード
bsr right
cmp.w x_max(pc),d2
bne right_demo0
right_demo8:
move.w (sp)+,s_dot8
right_demo9:
rts
*****************************************************************
* ウェイト値の変更チェック *
*****************************************************************
wait_chk:
movea.l #$800,a0
btst.b #2,8(a0) *'-'が押されたか?
beq wait_chk1
tst.b inkey_flg3
bne wait_chk9
st inkey_flg3
sub.w #1,_Wait
bpl wait_chk9
clr.w _Wait
bra wait_chk9
wait_chk1:
btst.b #6,8(a0) *'+'
beq wait_chk8
tst.b inkey_flg3
bne wait_chk9
st inkey_flg3
add.w #1,_Wait
cmp.w #4096,_Wait
bls wait_chk9
move.w #4096,_Wait
bra wait_chk9
wait_chk8:
sf inkey_flg3
wait_chk9:
rts
*****************************************************************
* スクロール *
*****************************************************************
go_scroll:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 右下(手抜き) *
*****************************************************************
right_down:
bsr right
bsr down
rts
*****************************************************************
* 左下(手抜き) *
*****************************************************************
left_down:
bsr left
bsr down
rts
*****************************************************************
* 右上(手抜き) *
*****************************************************************
right_up:
bsr right
bsr up
rts
*****************************************************************
* 左上(手抜き) *
*****************************************************************
left_up:
bsr left
bsr up
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot8(pc),d2
tst.w d2
bpl left1
clr.w d2
left1:
move.w x_old(pc),d5 *何ドットずらすか
sub.w d2,d5
beq left9
bsr x_set
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,pcx_x
move.w d5,pcx_xd
move.w y_old(pc),pcx_y
move.w y_line(pc),pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
adda.l #GRAM,a2
movea.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq left8
bsr get_pcx_addr
adda.w #256,a1
bsr get_gram_addr
adda.l #$c80000,a2
movea.l #$d00000,a5
bsr g8 *裏の表示
left8:
move.w d2,x_old
left9:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot8(pc),d3
tst.w d3
bpl up1
clr.w d3
up1:
move.w y_old(pc),d6 *何ドットずらすか
sub.w d3,d6
beq up9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),pcx_x
move.w x_line(pc),pcx_xd
move.w d3,pcx_y
move.w d6,pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
adda.l #GRAM,a2
movea.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq up8
move.w x_old(pc),d0 *表示開始X座標補正
add.w x_pos_bk(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w x_line_bk(pc),pcx_xd *ドット数補正
bsr get_pcx_addr
adda.w x_sabun_bk(pc),a1
bsr get_gram_addr
adda.l #$c80000,a2
movea.l #$d00000,a5
bsr g8 *裏の表示
bsr y_set
up8:
move.w d3,y_old
up9:
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot8(pc),d2
cmp.w x_max(pc),d2
bls right1
move.w x_max(pc),d2
right1:
move.w d2,d5 *何ドットずらすか
sub.w x_old(pc),d5
beq right9
bsr x_set
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
add.w #512,d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),pcx_x
add.w #512,pcx_x
move.w d5,pcx_xd
move.w y_old(pc),pcx_y
move.w y_line(pc),pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
adda.l #GRAM,a2
movea.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq right8
bsr get_pcx_addr
adda.w #256,a1
bsr get_gram_addr
adda.l #$c80000,a2
movea.l #$d00000,a5
bsr g8 *裏の表示
right8:
move.w d2,x_old
right9:
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot8(pc),d3
cmp.w y_max(pc),d3
bls down1
move.w y_max(pc),d3
down1:
bsr y_set
move.w d3,d6 *何ドットずらすか
sub.w y_old(pc),d6
beq down9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),pcx_x
move.w x_line(pc),pcx_xd
move.w y_old(pc),pcx_y
add.w #512,pcx_y
move.w d6,pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
adda.l #GRAM,a2
movea.l #$c80000,a5
bsr g8 *表の表示
tst.w x_line_bk *裏を表示するか
beq down8
move.w x_old(pc),d0 *表示開始X座標補正
add.w x_pos_bk(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w x_line_bk(pc),pcx_xd *ドット数補正
bsr get_pcx_addr
adda.w x_sabun_bk(pc),a1
bsr get_gram_addr
adda.l #$c80000,a2
movea.l #$d00000,a5
bsr g8 *裏の表示
down8:
move.w d3,y_old
down9:
rts
*****************************************************************
* スクロール分のグラフィックを表示する *
* gram_x, gram_y 表示先座標(GRAM) *
* pcx_x, pcx_y 表示元座標(PCX) *
* pcx_xd, pcx_yd ドット数 *
*****************************************************************
g8:
move.w pcx_xd(pc),d0 *横ドット数
move.w pcx_yd(pc),d7 *縦ドット数
movea.w line_byte(pc),a3 *次のラインへのバイト数
suba.w d0,a3 *(転送元)
movea.w #512,a4 *表示データの1ライン下までの差分
suba.w d0,a4 *(表示先)
adda.l a4,a4
move.w gram_x(pc),d6 *左右2回に分けての表示か
add.w pcx_xd(pc),d6
cmp.w #512,d6
bhi g8_3 *そう
cmpi.b #MC68060,MPUTYPE *MC68060か
bcc g8_60
cmpi.w #4,d0 *転送横サイズが4未満か
bcs g8_60
move.l a1,d6 *転送もとが奇数アドレスか
btst.l #0,d6
bne g8_k
g8_1:
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
lsr.w #2,d0
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
addq.l #1,a2 *転送先を奇数アドレスにする
g8_11:
move.w d0,d1
g8_12:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,g8_12
move.w d4,d1
beq g8_14
subq.w #1,d1
g8_13:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,g8_13
g8_14:
adda.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_15
suba.l #$80000,a2
g8_15:
dbra d7,g8_11
rts
g8_3: *左右2回に分けて表示
add.l #1024,a4 *1ライン下までの差分を補正
move.w #512,d0 *横ドット1
sub.w gram_x(pc),d0
move.w pcx_xd(pc),d6 *横ドット2
sub.w d0,d6
subq.w #1,d0
subq.w #1,d6
subq.w #1,d7
addq.l #1,a2 *転送先を奇数アドレスにする
g8_30:
move.w d0,d1 *右側
g8_31:
move.b (a1)+,(a2)
addq.l #2,a2
dbra d1,g8_31
g8_32:
move.w d6,d1 *左側
lea.l -1024(a2),a2
g8_33:
move.b (a1)+,(a2)
addq.l #2,a2
dbra d1,g8_33
adda.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_34
suba.l #$80000,a2
g8_34:
dbra d7,g8_30
rts
g8_k:
cmpi.w #5,d0 *転送横サイズが5以下か
bls g8_60 *そう
subq.w #1,d0
move.w d0,d4
andi.w #$fffC,d0
andi.w #$0003,d4
lsr.w #2,d0
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
addq.l #1,a2 *転送先を奇数アドレスにする
g8_k1:
move.b (a1)+,(a2)
addq.l #2,a2
move.w d0,d1
g8_k2:
move.l (a1)+,d6
movep.l d6,(a2)
addq.l #8,a2
dbra.w d1,g8_k2
move.w d4,d1
beq g8_k4
subq.w #1,d1
g8_k3:
move.b (a1)+,(a2)
addq.l #2,a2
dbra.w d1,g8_k3
g8_k4:
adda.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_k5
suba.l #$80000,a2
g8_k5:
dbra d7,g8_k1
rts
g8_60:
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
addq.l #1,a2 *転送先を奇数アドレスにする
g8_61:
move.w d0,d1
g8_62:
move.b (a1)+,(a2)
addq.l #2,a2
dbra d1,g8_62
adda.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *表示先アドレス更新
cmpa.l a5,a2
bcs g8_63
suba.l #$80000,a2
g8_63:
dbra d7,g8_61
rts
*****************************************************************
* PCXデータのアドレスを取得 *
*****************************************************************
get_pcx_addr:
move.w pcx_y(pc),d0 *(pcx_y*line_byte)+pcx_x+gr_addr
mulu line_byte(pc),d0
add.l gr_addr(pc),d0
movea.l d0,a1
adda.w pcx_x(pc),a1
rts
*****************************************************************
* GRAMのアドレスを取得 *
*****************************************************************
get_gram_addr:
move.w gram_x(pc),d0 *表示先画像アドレス
move.w gram_y(pc),d1 *gram_y*1024+gram_x*2
swap.w d1
clr.w d1
ror.l #6,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
rts
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
pcx_x .ds.w 1 *表示する座標(BMP)
pcx_y .ds.w 1
pcx_xd .ds.w 1 *表示するドット数
pcx_yd .ds.w 1
line_byte:
.ds.w 1 *1ラインのバイト数
x_line:
.ds.w 1 *表画面の横ドット数
y_line:
.ds.w 1 *縦ドット数
x_line_bk:
.ds.w 1 *裏画面の横ドット数
x_pos_bk:
.ds.w 1 *裏画面の表示位置X
x_sabun_bk:
.ds.w 1 *表画面と裏画面のX方向の差分
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
.even